/**
 * 给一个排列，做如下操作
 * 选定[s, e]，将其reverse
 * 然后把[e+1...]放在这一段的前面
 * 把[1...s-1]放在这一段后面
 * 如此得到一个新的排列
 * 问新排列的字典序最大可能是多少
 * 注意[s, e]前后均可为空
 * N在2000，可以用平方的算法
 * 只有两种可能性，假设[2...N]的最大值所在位置记作r
 * 则翻转必然发生在 [i...r-1]
 * 如果r==N，则翻转还可以发生在[i...r]
 * 由此可以得到2N个排列，找出最大的即可，
 * 怀疑根本不会达到N^2
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;

int N, K;
vi A;

bool cmp(const vi & a, const vi & b){
    for(int i=0;i<N;++i)if(a[i]!=b[i])return a[i] > b[i];
    return false;
}

void proc(){
    int start = 1;
    for(int i=2;i<N;++i)if(A[start]<A[i])start = i;


    vi ans, tmp;
    for(int i=0;i<start;++i){
        tmp.clear(); tmp.reserve(N);
        copy(A.begin()+start, A.end(), back_inserter(tmp));
        auto sz = tmp.size();
        copy(A.begin()+i, A.begin()+start, back_inserter(tmp));
        reverse(tmp.begin()+sz, tmp.end());
        copy(A.begin(), A.begin() + i, back_inserter(tmp));
        if(ans.empty() or cmp(tmp, ans)) ans.swap(tmp);
    }

    if(start + 1 == N)for(int i=0;i<=start;++i){
        tmp.clear(); tmp.reserve(N);
        copy(A.begin()+start, A.end(), back_inserter(tmp));
        auto sz = tmp.size();
        copy(A.begin()+i, A.begin()+start, back_inserter(tmp));
        reverse(tmp.begin()+sz, tmp.end());
        copy(A.begin(), A.begin() + i, back_inserter(tmp));
        if(ans.empty() or cmp(tmp, ans)) ans.swap(tmp);            
    }

    for(auto i : ans) cout << i << " ";
    cout << endl;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--){
        cin >> N;
        A.assign(N, 0);
        for(auto & i : A) cin >> i;
        proc();
    }
    return 0;
}